python-hooks.c \
python-shell.h \
python-shell.c \
+ resource-list.h \
+ resource-list.c \
resources.h \
resources.c \
signals-list.h \
general.ui \
object-hierarchy.ui \
prop-list.ui \
+ resource-list.ui \
signals-list.ui \
visual.ui \
widget-tree.ui \
#include "prop-list.h"
#include "python-hooks.h"
#include "python-shell.h"
+#include "resource-list.h"
#include "resources.h"
#include "signals-list.h"
#include "visual.h"
g_type_ensure (GTK_TYPE_INSPECTOR_PROPERTY_CELL_RENDERER);
g_type_ensure (GTK_TYPE_INSPECTOR_PROP_LIST);
g_type_ensure (GTK_TYPE_INSPECTOR_PYTHON_SHELL);
+ g_type_ensure (GTK_TYPE_INSPECTOR_RESOURCE_LIST);
g_type_ensure (GTK_TYPE_INSPECTOR_SIGNALS_LIST);
g_type_ensure (GTK_TYPE_INSPECTOR_VISUAL);
g_type_ensure (GTK_TYPE_INSPECTOR_WIDGET_TREE);
<file>general.ui</file>
<file>object-hierarchy.ui</file>
<file>prop-list.ui</file>
+ <file>resource-list.ui</file>
<file>signals-list.ui</file>
<file>visual.ui</file>
<file>widget-tree.ui</file>
--- /dev/null
+/*
+ * Copyright (c) 2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <glib/gi18n-lib.h>
+#include "resource-list.h"
+
+enum
+{
+ COLUMN_NAME,
+ COLUMN_PATH
+};
+
+struct _GtkInspectorResourceListPrivate
+{
+ GtkTreeStore *model;
+ GtkTextBuffer *buffer;
+ GtkWidget *image;
+ GtkWidget *content;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorResourceList, gtk_inspector_resource_list, GTK_TYPE_BOX)
+
+static void
+load_resources_recurse (GtkInspectorResourceList *sl,
+ GtkTreeIter *parent,
+ const gchar *path)
+{
+ gchar **names;
+ gint i;
+ GtkTreeIter iter;
+
+ names = g_resources_enumerate_children (path, 0, NULL);
+ for (i = 0; names[i]; i++)
+ {
+ gint len;
+ gchar *p;
+ gboolean has_slash;
+
+ p = g_strconcat (path, names[i], NULL);
+
+ len = strlen (names[i]);
+ has_slash = names[i][len - 1] == '/';
+
+ if (has_slash)
+ names[i][len - 1] = '\0';
+
+ gtk_tree_store_append (sl->priv->model, &iter, parent);
+ gtk_tree_store_set (sl->priv->model, &iter,
+ COLUMN_NAME, names[i],
+ COLUMN_PATH, p,
+ -1);
+
+ if (has_slash)
+ load_resources_recurse (sl, &iter, p);
+
+ g_free (p);
+ }
+ g_strfreev (names);
+
+}
+
+static void
+selection_changed (GtkTreeSelection *selection,
+ GtkInspectorResourceList *rl)
+{
+ GtkTreeIter iter;
+
+ if (gtk_tree_selection_get_selected (selection, NULL, &iter))
+ {
+ gchar *path;
+ GBytes *bytes;
+ gchar *type;
+ gconstpointer data;
+ gsize size;
+ GError *error = NULL;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (rl->priv->model), &iter,
+ COLUMN_PATH, &path,
+ -1);
+ if (g_str_has_suffix (path, "/"))
+ {
+ gtk_text_buffer_set_text (rl->priv->buffer, "", -1);
+ gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
+ goto out;
+ }
+ bytes = g_resources_lookup_data (path, 0, &error);
+ if (bytes == NULL)
+ {
+ gtk_text_buffer_set_text (rl->priv->buffer, error->message, -1);
+ g_error_free (error);
+ gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
+ }
+ else
+ {
+ data = g_bytes_get_data (bytes, &size);
+ type = g_content_type_guess (NULL, data, size, NULL);
+ if (g_content_type_is_a (type, "text/*"))
+ {
+ gtk_text_buffer_set_text (rl->priv->buffer, data, -1);
+ gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
+ }
+ else if (g_content_type_is_a (type, "image/*"))
+ {
+ gtk_image_set_from_resource (GTK_IMAGE (rl->priv->image), path);
+ gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "image");
+ }
+ else
+ {
+ gchar *content;
+ content = g_content_type_get_description (type);
+ gtk_text_buffer_set_text (rl->priv->buffer, content, -1);
+ g_free (content);
+ gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
+ }
+ g_free (type);
+ g_bytes_unref (bytes);
+ }
+out:
+ g_free (path);
+ }
+ else
+ {
+ gtk_text_buffer_set_text (rl->priv->buffer, "", -1);
+ gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
+ }
+}
+
+static void
+load_resources (GtkInspectorResourceList *sl)
+{
+
+ load_resources_recurse (sl, NULL, "/");
+}
+
+static void
+gtk_inspector_resource_list_init (GtkInspectorResourceList *sl)
+{
+ sl->priv = gtk_inspector_resource_list_get_instance_private (sl);
+ gtk_widget_init_template (GTK_WIDGET (sl));
+ load_resources (sl);
+}
+
+static void
+gtk_inspector_resource_list_class_init (GtkInspectorResourceListClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/inspector/resource-list.ui");
+ gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, model);
+ gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, buffer);
+ gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, content);
+ gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, image);
+
+ gtk_widget_class_bind_template_callback (widget_class, selection_changed);
+}
+
+// vim: set et sw=2 ts=2:
--- /dev/null
+/*
+ * Copyright (c) 2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _GTK_INSPECTOR_RESOURCE_LIST_H_
+#define _GTK_INSPECTOR_RESOURCE_LIST_H_
+
+#include <gtk/gtk.h>
+
+#define GTK_TYPE_INSPECTOR_RESOURCE_LIST (gtk_inspector_resource_list_get_type())
+#define GTK_INSPECTOR_RESOURCE_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_INSPECTOR_RESOURCE_LIST, GtkInspectorResourceList))
+#define GTK_INSPECTOR_RESOURCE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_INSPECTOR_RESOURCE_LIST, GtkInspectorResourceListClass))
+#define GTK_INSPECTOR_IS_RESOURCE_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_INSPECTOR_RESOURCE_LIST))
+#define GTK_INSPECTOR_IS_RESOURCE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_INSPECTOR_RESOURCE_LIST))
+#define GTK_INSPECTOR_RESOURCE_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_INSPECTOR_RESOURCE_LIST, GtkInspectorResourceListClass))
+
+
+typedef struct _GtkInspectorResourceListPrivate GtkInspectorResourceListPrivate;
+
+typedef struct _GtkInspectorResourceList
+{
+ GtkBox parent;
+ GtkInspectorResourceListPrivate *priv;
+} GtkInspectorResourceList;
+
+typedef struct _GtkInspectorResourceListClass
+{
+ GtkBoxClass parent;
+} GtkInspectorResourceListClass;
+
+G_BEGIN_DECLS
+
+GType gtk_inspector_resource_list_get_type (void);
+
+G_END_DECLS
+
+#endif // _GTK_INSPECTOR_RESOURCE_LIST_H_
+
+// vim: set et sw=2 ts=2:
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="gtk30">
+ <object class="GtkTreeStore" id="model">
+ <columns>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkTextBuffer" id="buffer">
+ <property name="text"></property>
+ </object>
+ <template class="GtkInspectorResourceList" parent="GtkBox">
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="expand">True</property>
+ <property name="hscrollbar-policy">automatic</property>
+ <property name="vscrollbar-policy">always</property>
+ <property name="shadow-type">in</property>
+ <child>
+ <object class= "GtkTreeView">
+ <property name="visible">True</property>
+ <property name="model">model</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection">
+ <property name="mode">single</property>
+ <signal name="changed" handler="selection_changed"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="title" translatable="yes">Path</property>
+ <child>
+ <object class="GtkCellRendererText">
+ <property name="scale">0.8</property>
+ </object>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="content">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="expand">True</property>
+ <property name="hscrollbar-policy">automatic</property>
+ <property name="vscrollbar-policy">automatic</property>
+ <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkTextView">
+ <property name="visible">True</property>
+ <property name="editable">False</property>
+ <property name="buffer">buffer</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">text</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="expand">True</property>
+ <property name="hscrollbar-policy">automatic</property>
+ <property name="vscrollbar-policy">automatic</property>
+ <property name="shadow-type">in</property>
+ <child>
+ <object class="GtkImage" id="image">
+ <property name="visible">True</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">image</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
<property name="label" translatable="yes">Custom CSS</property>
</object>
</child>
+ <child>
+ <object class="GtkInspectorResourceList">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Resources</property>
+ </object>
+ </child>
<child>
<object class="GtkInspectorGeneral">
<property name="visible">True</property>
gtk/inspector/inspect-button.c
gtk/inspector/object-hierarchy.ui.h
gtk/inspector/prop-list.ui.h
+gtk/inspector/resource-path.ui.h
gtk/inspector/signals-list.c
gtk/inspector/signals-list.ui.h
gtk/inspector/visual.ui.h